# -*- coding: utf-8 -*-
"""
Created on Wed Sep 11 15:03:07 2019

@author: Administrator
"""

import jieba
from gensim import corpora,models,similarities


'''以下doc0-doc7是几个最简单的文档，我们可以称之为目标文档，
本文就是分析doc_test（测试文档）与以上8个文档的相似度。'''

doc0 = "我不喜欢上海"
doc1 = "上海是一个好地方"
doc2 = "北京是一个好地方"
doc3 = "上海好吃的在哪里"
doc4 = "上海好玩的在哪里"
doc5 = "上海是好地方"
doc6 = "上海路和上海人"
doc7 = "喜欢小吃"
doc_test="我喜欢上海的小吃"

'''
分词
首先，为了简化操作，把目标文档放到一个列表all_doc中。
'''
all_doc = []
all_doc.append(doc0)
all_doc.append(doc1)
all_doc.append(doc2)
all_doc.append(doc3)
all_doc.append(doc4)
all_doc.append(doc5)
all_doc.append(doc6)
all_doc.append(doc7)



#以下对目标文档进行分词，并且保存在列表all_doc_list中
all_doc_list = []
for doc in all_doc:
    doc_list = [word for word in jieba.cut(doc)]
    all_doc_list.append(doc_list)

#把分词后形成的列表显示出来：
print(all_doc_list)


#以下把测试文档也进行分词，并保存在列表doc_test_list中
doc_test_list = [word for word in jieba.cut(doc_test)]
doc_test_list


#--------------------------------制作语料库------------------------------------
#首先用dictionary方法获取词袋（bag-of-words)
dictionary = corpora.Dictionary(all_doc_list)


#词袋中用数字对所有词进行了编号
dictionary.keys()

#编号与词之间的对应关系
dictionary.token2id



#以下使用doc2bow制作语料库
corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]

'''
语料库是一组向量,向量中的元素是一个二元组(编号,频数),对应分词后的文档中的每一个词。

[[(0, 1), (1, 1), (2, 1), (3, 1)], 
[(0, 1), (4, 1), (5, 1), (6, 1), (7, 1)], 
[(4, 1), (5, 1), (6, 1), (7, 1), (8, 1)], 
[(0, 1), (9, 1), (10, 1), (11, 1), (12, 1)], 
[(0, 1), (9, 1), (10, 1), (12, 1), (13, 1)], 
[(0, 1), (5, 1), (6, 1), (7, 1)], 
[(0, 2), (14, 1), (15, 1), (16, 1)], 
[(2, 1), (17, 1)]]

'''

#以下用同样的方法，把测试文档也转换为二元组的向量
doc_test_vec = dictionary.doc2bow(doc_test_list)
doc_test_vec

#-------------------------------------相似度分析--------------------------------
#使用TF-IDF模型对语料库建模
tfidf = models.TfidfModel(corpus)

#获取测试文档中，每个词的TF-IDF值
tfidf[doc_test_vec]

#对每个目标文档，分析测试文档的相似度
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys()))
sim = index[tfidf[doc_test_vec]]
sim

#根据相似度排序
sorted(enumerate(sim), key=lambda item: -item[1])